/*
Copyright (C) Ariff Ehsan, Abdul Hadi Fikri

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

/*  Author : Ariff Ehsan
 *           Abdul Hadi Fikri
 *  Date   : June 18, 2009
 *
 *  Log    : Jan 11, 2010 ? ariff ehsan
 *           - code cleanup, add comment
 */


#ifndef __TASK_H__
#define __TASK_H__


/**
 *  task object structure
 */
typedef struct task_t {
	uint8_t scheduled : 1;
	void (*run)(void);
	struct task_t* next;
} task_t;


/**
 *  Task Registration
 *  - MUST be called before using task object
 *  - to initialize task object and link event function
 *
 *  @task - pointer to task object
 *  @run  - pointer to event function
 */
void TASK_reg(task_t *task, void (*run)(void));


/**
 *  Task Post
 *  - to post a task. the posted task will be queued
 *
 *  @task - pointer to task object
 */
void TASK_post(task_t* task);


/**
 *  Task Run
 *  - only can be called by kernel/system
 */
void TASK_run(void);


/**
 *  Task Initialization
 *  - called within system initialization
 */
void TASK_init(void);


#endif // __TASK_H__
